﻿#ifndef DURON_HTTPFILEMANAGER_H
#define DURON_HTTPFILEMANAGER_H

#include "HttpBody.h"
#include "HttpCookie.h"
#include "Parser.h"
#include "Network/TcpSession.h"
#include "Util/function_traits.h"

namespace toolkit {

	class HttpResponseInvokerImp {
	public:
		typedef std::function<void(int code, const StrCaseMap &headerOut, const HttpBody::Ptr &body)> HttpResponseInvokerLambda0;
		typedef std::function<void(int code, const StrCaseMap &headerOut, const string &body)> HttpResponseInvokerLambda1;

		HttpResponseInvokerImp() {}
		~HttpResponseInvokerImp() {}
		template<typename C>
		HttpResponseInvokerImp(const C &c) :HttpResponseInvokerImp(typename function_traits<C>::stl_function_type(c)) {}
		HttpResponseInvokerImp(const HttpResponseInvokerLambda0 &lambda);
		HttpResponseInvokerImp(const HttpResponseInvokerLambda1 &lambda);

		void operator()(int code, const StrCaseMap &headerOut, const HttpBody::Ptr &body) const;
		void operator()(int code, const StrCaseMap &headerOut, const string &body) const;

		void responseFile(const StrCaseMap &requestHeader, const StrCaseMap &responseHeader, const string &filePath) const;
		operator bool();
	private:
		HttpResponseInvokerLambda0 _lambad;
	};

	/**
	 * 该对象用于控制http静态文件夹服务器的访问权限
	 */
	class HttpFileManager {
	public:
		typedef function<void(int code, const string &content_type, const StrCaseMap &responseHeader, const HttpBody::Ptr &body)> invoker;

		/**
		 * 访问文件或文件夹
		 * @param sender 事件触发者
		 * @param parser http请求
		 * @param cb 回调对象
		*/
		static void onAccessPath(TcpSession &sender, Parser &parser, const invoker &cb);

		/**
		 * 获取mime值
		 * @param name 文件后缀
		 * @return mime值
		 */
		static const string &getContentType(const char *name);
	private:
		HttpFileManager() = delete;
		~HttpFileManager() = delete;
	};

}


#endif //DURON_HTTPFILEMANAGER_H
